﻿using System;
using System.Collections.Generic;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;
using Onshi.POS.Vendedores.Vistas;

namespace Onshi.POS.Vendedores
{
    public class VendedoresAltaModificacionPresentador
    {
        #region Constructores

        public VendedoresAltaModificacionPresentador(IVendedoresAltaModificacion vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IVendedoresAltaModificacion vista;

        #endregion

        #region Propiedades

        private RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        private RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        private RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        private RepositorioTipoDomicilio RepositorioTipoDomicilio
        {
            get { return new RepositorioTipoDomicilio(); }
        }

        private RepositorioTipoTelefono RepositorioTipoTelefono
        {
            get { return new RepositorioTipoTelefono(); }
        }

        private RepositorioTipoComisionVendedor RepositorioTipoComisionVendedor
        {
            get { return new RepositorioTipoComisionVendedor(); }
        }

        private RepositorioRubroVendedor RepositorioRubroVendedor
        {
            get { return new RepositorioRubroVendedor(); }
        }

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        private RepositorioTipoMensajeriaInstantanea RepositorioTipoMensajeriaInstantanea
        {
            get { return new RepositorioTipoMensajeriaInstantanea(); }
        }

        #endregion

        #region Metodo

        public void Inicializar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    vista.ListaDomicilios = new List<DomicilioVendedor>();
                    vista.ListaTelefonos = new List<TelefonoVendedor>();
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    var vendedor = RepositorioVendedor.DevolverPorIdConDetalleDomiciliosTelefonos(vista.IdVendedor);
                    if (vendedor == null)
                        throw new Exception("El vendedor no existe");
                    vista.IdVendedor = vendedor.Id;
                    vista.IdRubroVendedor = vendedor.Rubro.Id;
                    vista.IdTipoComisionVendedor = vendedor.TipoComision.Id;
                    vista.IdTipoMensajeriaInstantanea = vendedor.TipoMensajeriaInstantanea.Id;
                    vista.Codigo = vendedor.Codigo;
                    vista.Nombre = vendedor.Nombre;
                    vista.Cuit = vendedor.Cuit;
                    vista.Comision = vendedor.Comision;
                    vista.ComisionMaxima = vendedor.ComisionMaxima;
                    vista.Email = vendedor.Email;
                    vista.SitioWeb = vendedor.SitioWeb;
                    vista.MensajeriaInstantanea = vendedor.MensajeriaInstantanea;
                    vista.ListaDomicilios = vendedor.Domicilios;
                    vista.ListaTelefonos = vendedor.Telefonos;
                    vista.Imagen = vendedor.Detalle.Imagen;
                    vista.Observacion = vendedor.Detalle.Observacion;
                    break;
            }
        }

        public void Aceptar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    if (!DatosComunes.TienePermiso(EnumPermiso.VENDEDOR_ALTA))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    if (!DatosComunes.TienePermiso(EnumPermiso.VENDEDOR_MODIFICACION))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
            }
            if (vista.EstadoABM == EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION)
            {
                if (vista.IdVendedor == (Int32)EnumVendedor.TITULAR_DEL_COMERCIO)
                    throw new Exception("El vendedor no se puede modificar");
                if (RepositorioVendedor.DevolverPorId(vista.IdVendedor) == null)
                    throw new Exception("El vendedor no existe");
            }
            var vendedor = new Vendedor();
            vendedor.Rubro = RepositorioRubroVendedor.DevolverPorId(vista.IdRubroVendedor);
            if (vendedor.Rubro == null)
                throw new Exception("El rubro no existe");
            vendedor.TipoComision = RepositorioTipoComisionVendedor.DevolverPorId(vista.IdTipoComisionVendedor);
            if (vendedor.TipoComision == null)
                throw new Exception("El tipo de comisión no existe");
            vendedor.TipoMensajeriaInstantanea = RepositorioTipoMensajeriaInstantanea.DevolverPorId(vista.IdTipoMensajeriaInstantanea);
            if (vendedor.TipoMensajeriaInstantanea == null)
                throw new Exception("El tipo de mensajeria instantanea no existe");
            vendedor.Codigo = vista.Codigo;
            if (vendedor.Codigo.Trim() == String.Empty)
                throw new Exception("El código no puede quedar vacio");
            vendedor.Nombre = vista.Nombre;
            if (vendedor.Nombre.Trim() == String.Empty)
                throw new Exception("El nombre no puede quedar vacio");
            vendedor.Cuit = vista.Cuit;
            switch ((EnumTipoComisionVendedor)vendedor.TipoComision.Id)
            {
                case EnumTipoComisionVendedor.SIN_COMISION:
                    vendedor.Comision = 0;
                    vendedor.ComisionMaxima = 0;
                    break;
                case EnumTipoComisionVendedor.PORCENTAJE_DE_LA_GANANCIA:
                case EnumTipoComisionVendedor.PORCENTAJE_DE_VENTA:
                    vendedor.Comision = vista.Comision;
                    vendedor.ComisionMaxima = vista.ComisionMaxima;
                    break;
                case EnumTipoComisionVendedor.MONTO_FIJO:
                    vendedor.Comision = vista.Comision;
                    vendedor.ComisionMaxima = 0;
                    break;
            }
            vendedor.Email = vista.Email;
            vendedor.SitioWeb = vista.SitioWeb;
            vendedor.Detalle = new DetalleVendedor();
            vendedor.Detalle.Vendedor = vendedor;
            vendedor.Detalle.Observacion = vista.Observacion;
            vendedor.Detalle.Imagen = vista.Imagen;
            if ((EnumTipoMensajeriaInstantanea)vendedor.TipoMensajeriaInstantanea.Id == EnumTipoMensajeriaInstantanea.NO_UTILIZA)
                vendedor.MensajeriaInstantanea = String.Empty;
            else
                vendedor.MensajeriaInstantanea = vista.MensajeriaInstantanea;
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.VENDEDOR_ALTA);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.VENDEDOR_MODIFICACION);
                    break;
            }
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    RepositorioVendedor.Insertar(vendedor);
                    RepositorioVendedor.InsertarDetalle(vendedor.Detalle);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    vendedor.Id = vista.IdVendedor;
                    RepositorioVendedor.Modificar(vendedor);
                    RepositorioVendedor.ModificarDetalle(vendedor.Detalle);
                    RepositorioVendedor.EliminarDomiciliosPorVendedor(vendedor);
                    RepositorioVendedor.EliminarTelefonosPorVendedor(vendedor);
                    break;
            }
            RepositorioRegistro.Insertar(registro, vendedor);
            foreach (var item in vista.ListaDomicilios)
            {
                item.Vendedor = vendedor;
                item.Barrio = RepositorioBarrio.DevolverPorId(item.Barrio.Id);
                item.Tipo = RepositorioTipoDomicilio.DevolverPorId(item.Tipo.Id);
                if (item.Tipo != null && item.Barrio != null)
                    RepositorioVendedor.InsertarDomicilio(item);
            }
            foreach (var item in vista.ListaTelefonos)
            {
                item.Vendedor = vendedor;
                item.Tipo = RepositorioTipoTelefono.DevolverPorId(item.Tipo.Id);
                if (item.Tipo != null)
                    RepositorioVendedor.InsertarTelefono(item);
            }
        }

        #endregion
    }
}
